<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/27 0027
 * Time: 00:00
 */
//转义序列
//1要匹配 4** 可以用 /^4\*\*$/
preg_match('/^4\*\*/','4**asdasdasd',$matches);//单引号
preg_match("/^4\*\*/",'4**asdasdasd',$matches);//双引号  测试单双引号结果是相同的 注意 "/^4\*\*/"也适用 因为PHP不认为\*是一个有效的转义序列
preg_match("/^4\\*\\*/",'4**asdasdasd',$matches);//双引号
//array(1) {
//    [0]=>
//  string(3) "4**"
//}
//2 \\ 转义 \从而它在正则式中可以正常使用
$subject = 'PHP\5';
$pattern1 = '/^PHP\\\5$/'; //这里使用三个反斜杠是因为PHP在解析脚本的时候把单引号里面的\认为是一个特殊的字符 例如$str1 = 'a\'5'所以第一个为\ 为php转义第二个\ 而且这两个 \\朱合起来转义第三个\
$pattern2 = "/^PHP\\\\5$/";
preg_match($pattern1,$subject,$matches1);
preg_match($pattern2,$subject,$matches2);
//"/^PHP\\\\5$/" 有四个反斜线 因为在双引号中\5对于php来讲有特殊的意义 它表示八进制字符5 当然在这里也失去它真正的作用 但是给真正带来的问题所以 不得不再使用第三个 \转义他

//$str1 = 'a\'5';
//$str2 = "a\"5";
//echo $str1 .PHP_EOL;
//echo $str2 .PHP_EOL;
// \a BEL字符 (ASCII7)
// \e 转义字符 (ASCII27)
// \f 进制字符 (ASC10)
// \n 换行符 (ASCII10)
// \r 回车符 (ASCII13)
// \t 制表符 (ASCII9)
// \xhh 任意用十六进制代码表示任何字符(hh)
// \ddd 任意用八进制表示任何字符(ddd)
// \d 任意十进制的数字
// \D 任意非十进制的字符 与[^0-9] 一样
// \s 任意空白字符 与[\r\f\r\n] 类似 或者换而言之 制表 进制符 回车 换行 空格
// \S 任意非空白字符

// \w 任意属于一个词的部分字符 指任意字母或者数字 或者下划线字符 字母是当先语言的字母
//setlocale(LC_ALL,'C'); 设为荷兰
preg_match('/^\w+/','adasdasd',$matches);
// \W 任意\w   以外的字符
//preg_match('/^\w+/','adasdasd',$matches);
preg_match('/^\W+/','aaaa1212dasdasd',$matches);

//\b 一个词语界限的锚点 对于简单的词语 它的指的是一个字符串中一个词语字符(\w)和一个非词语字符(\W)之间的分界点
preg_match('/\b.+\b/','###yinfanlaing123##',$matches);
//array(1) {
//    [0]=>
//  string(14) "yinfanlaing123"
//}
preg_match('/\w+/','###yinfanlaing123##',$matches);
//array(1) {
//    [0]=>
//  string(14) "yinfanlaing123"
//}
// \B 与\b相反 它表示两个\w集中词语之间或则两个来个来之\W非词语字符的锚点

preg_match('/\B.+\B/','#Testing',$matches);
//array(1) {
//    [0]=>
//  string(5) "estin"
//}


//例子
//1. /\w+\s+\w+/ 匹配用空白符分隔开词语
preg_match('/\w+\s+\w+/','y f l p l',$matches);
//array(1) {
//    [0]=>
//  string(3) "y f"
//}
//preg_match_all('/\w+\s+\w+/','y f l p l',$matches);
//array(1) {
//    [0]=>
//  array(2) {
//        [0]=>
//    string(3) "y f"
//        [1]=>
//    string(3) "l p"
//  }
//}
//2 匹配一个(但是没有验证的)IP地址IP地址可以出现咋任意一个字符串中 212.187.38.47
//  /(\d{1,3}\.){3}\d{1,3}/
preg_match('/(\d{1,3}\.){3}\d{1,3}/','my id address 212.187.38.47',$matches);
//array(2) {
//    [0]=>
//  string(13) "212.187.38.47"
//    [1]=>
//  string(3) "38."
//}
preg_match('/(\d{1,}\.){3}\d{1,3}/','my id address 212.187.38.47',$matches);
//3 无限匹配  假设你的字符串如下 你想匹配第一<a/>标记的字符串
//<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a> urL
preg_match('/<a.*>*<\/a>/',"<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a> urL",$matches);
//array(1) {
//    [0]=>
//  string(89) "<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a>"
//}
preg_match('/<a.*>(.*)<\/a>/',"<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a> urL",$matches);
//array(2) {
//    [0]=>
//  string(89) "<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a>"
//    [1]=>
//  string(8) "xinlaing"
//}
preg_match('/<a.*?>(.*?)<\/a>/',"<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a> urL",$matches);
//因为* 和+ 都是无限制的运算符 用? 配合限制 告诉pcre引擎不要无限贪婪匹配
//array(2) {
//    [0]=>
//  string(41) "<a href='http://www.baidu.com'>百度</a>"
//    [1]=>
//  string(6) "百度"
//}

//修饰符
// i  使得pcre引擎用大小不敏感的方式去匹配 /[a-z]/ 匹配a...z范围一个字母 /[a-z]/i 匹配 A...Z a...z范围的一个字母

// m 改变^和$的运行方式为 ^ 会匹配紧跟换行后面的那个字符 而$会匹配紧跟换行符前面的字符
preg_match('/^DEF/',"ABC\nDEF\nGHI",$matches1);
preg_match('/^DEF/m',"ABC\nDEF\nGHI",$matches2);
//array(0) {
//}
//array(1) {
//    [0]=>
//  string(3) "DEF"
//}
// s 设置 .(点)还匹配换行字符 如果不设置这个修饰符(默认值情况下)它讲不匹配换行符
preg_match('/BC.DE/',"ABC\nDEF\nGHI",$matches1);
preg_match('/BC.DE/s',"ABC\nDEF\nGHI",$matches2);

//array(0) {
//}
//array(1) {
//    [0]=>
//  string(5) "BC
//DE"
//}
//x 如果设置了该修饰符 可以把任意个空白符放到正则式中 字符类[]的空白符除外
preg_match('/A B C/',"ABC\nDEF\nGHI",$matches1);
preg_match('/A B C/x',"ABC\nDEF\nGHI",$matches2);
//array(0) {
//}
//array(1) {
//    [0]=>
//  string(3) "ABC"
//}
// A 和 ^ 一样的作用 除非你还设置了m

preg_match('/BC/',"ABC\nDEF\nGHI",$matches1);
preg_match('/BC/A',"ABC\nDEF\nGHI",$matches2);
//array(1) {
//    [0]=>
//  string(2) "BC"
//}
//array(0) {
//}
// D 如果有换行符 让$只匹配标题内容串结束的部分 而不是结束前的字符
preg_match('/BC$/',"ABC\n",$matches1);
preg_match('/BC$/D',"ABC\n",$matches2);
//array(1) {
//    [0]=>
//  string(2) "BC"
//}
//array(0) {
//}

// U 变换pcre引擎的贪吃无限性 数量符默认下边的不在无限制 而且?字符表示打开无限制 这使得
/**
 * '/<a.*?>(.*)<\/a>/' 和 /<a.*>.*<\/a>/U
 */
preg_match('/<a.*>.*<\/a>/U',"<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a> urL",$matches);
//array(1) {
//    [0]=>
//  string(41) "<a href='http://www.baidu.com'>百度</a>"
//}
preg_match('/<a.*?>(.*?)<\/a>/U',"<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a> urL",$matches);
//array(1) {
//    [0]=>
//  string(89) "<a href='http://www.baidu.com'>百度</a> has an <a href='http://xinlang.cn'>xinlaing</a>"
//}


//X 打开PCRE引擎的额外的特性 打开的问题的特性是引擎将在检查一个为知的转义序列跑出一个错误 //没有抛出错误
preg_match('/\\\h/','\\h',$matches1);
preg_match('/\\h/X','\\h',$matches2); //
//var_dump($matches1,$matches2);
// u 打开UTF-8模式 在utf-8模式下 pcre引擎把正则式对待为utf-8编码 意味着 .(点)匹配多字节字符
preg_match('/D.rick/','D.rick',$matches1);
preg_match('/D.rick/u','D.rick',$matches2); // 结果一样
//array(1) {
//    [0]=>
//  string(6) "D.rick"
//}
//array(1) {
//    [0]=>
//  string(6) "D.rick"
//}
var_dump($matches1,$matches2);
